package com.stu.day18;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * Class.forName(String className)：加载指定名称的类。
 *
 * getName()：获取类的全名。
 * getSimpleName()：获取类的简单名称（不包含包名）。
 *
 * getDeclaredMethods()：获取所有声明的方法，包括私有方法。
 * getMethods()：获取类及其父类的所有公共方法。
 *
 * getDeclaredFields()：获取类所有声明的字段，包括私有字段。
 * getFields()：获取类及其父类的所有公共字段。
 *
 * getConstructors()：获取类的所有构造方法。
 * getDeclaredConstructors()：获取类声明的所有构造方法（包括私有的）。
 *
 * get(Object obj)：获取字段的值。
 * set(Object obj, Object value)：设置字段的值。
 * getType()：获取字段的类型。
 * setAccessible(true)：设置字段可访问，即使是私有字段也可以访问。
 * @author zy
 * @date 2025/2/20 09:45
 */
public class FieldDemo {
    public static void main(String[] args) {
        Class<?> c1 = User.class;
        Class<?> c;
        try {
            c = Class.forName("com.stu.day18.User");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

        Field[] fields = c.getDeclaredFields();  // 获取类所有声明的字段，包括私有字段。
        for (Field field : fields) {
            //获取字段的修饰符: private-2 默认的-0 protected-4 public-1
            int modifiers = field.getModifiers();
            System.out.print(modifiers+"\t");
            System.out.print(Modifier.toString(modifiers)+"\t");

            Class<?> type = field.getType();  // 获取字段的类型,用Class<?>接收
            System.out.print(type.getName()+"\t");  // 全称
            System.out.print(type.getSimpleName()+"\t");  // 简称

            System.out.print(field.getName()+"\t");  // 属性名

            System.out.println();
        }

        try {
            User user = (User) c.newInstance();  // 过时了,现用Constructor.newInstance()代替
            Field field = c.getDeclaredField("id");  // id属性
            field.setAccessible(true);
            field.set(user, 2);  // user的id属性设置为2

            System.out.println(user);
        } catch (InstantiationException e) {
            throw new RuntimeException(e);
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(e);
        }
    }
}
